package com.ads.tpgrupo4.server.xml.mappers;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import sun.reflect.generics.reflectiveObjects.NotImplementedException;

import com.ads.tpgrupo4.domain.cpr.core.Rodamiento;
import com.ads.tpgrupo4.domain.cpr.cotizacion.ItemCotizacionDeRodamiento;
import com.ads.tpgrupo4.domain.cpr.ordenDePedido.OrdenDePedido;
import com.ads.tpgrupo4.domain.cpr.remito.ItemOrigenDeItemRemitoACliente;
import com.ads.tpgrupo4.domain.cpr.remito.ItemRemitoACliente;
import com.ads.tpgrupo4.domain.cpr.remito.RemitoACliente;
import com.ads.tpgrupo4.server.remote.PersistenceService;
import com.ads.tpgrupo4.server.utils.DateUtils;
import com.ads.tpgrupo4.server.xml.StringBasedXmlSource;
import com.ads.tpgrupo4.server.xml.XmlSource;

public class RemitoAClienteXmlMapper extends AbstractXmlMapper<RemitoACliente> {

	private PersistenceService persistenceService = PersistenceService.getInstance();
	
	private static RemitoAClienteXmlMapper instance;
	
	public static RemitoAClienteXmlMapper getInstance() {

		if (instance == null) {
			instance = new RemitoAClienteXmlMapper();
		}
		
		return instance;
	}
	
	private RemitoAClienteXmlMapper() {
	}
	
	@Override
	public XmlSource map(final RemitoACliente remito) throws Exception {
		
		final Map<OrdenDePedido, String> remitoAClienteItemParts = new HashMap<OrdenDePedido, String>();

		final StringBuilder sb = new StringBuilder();
		sb.append("<Remito numero=\"nroDeRemito\">\r\n" + 
				" <Emision>fechaEmision</Emision>\r\n" + 
				" <Cliente>\r\n" + 
				"  <Cuil>cuilCliente</Cuil>\r\n" + 
				"  <RazonSocial>razonSocialCliente</RazonSocial>\r\n" + 
				" </Cliente>\r\n<Referencia>\r\n");
		
		for (final ItemRemitoACliente itemRemito : remito.getItems()) {
		
			final ItemOrigenDeItemRemitoACliente itemOrigen = itemRemito.getItemsOrigen().get(0);
			final ItemCotizacionDeRodamiento itemCotizacion = (ItemCotizacionDeRodamiento) itemOrigen.getItemOrigen();
			final Long nroCotizacionOrigen = itemCotizacion.getCotizacionOrigen().getNumero();
			final Rodamiento rodamiento = itemCotizacion.getRodamiento();
			
			final OrdenDePedido ordenDePedido = this.persistenceService.findOrdenDePedidoByNumeroCotizacion(nroCotizacionOrigen);
			
			String ordenDePedidoXmlPart = this.getOrdenDePedidoXmlPart(ordenDePedido, remitoAClienteItemParts);
			
			ordenDePedidoXmlPart = ordenDePedidoXmlPart.concat(" <Item serie=\"nroDeSerie\"> \r\n" + 
					"		<Sufijo>sufix</Sufijo>\r\n" + 
					"		<Marca>marca</Marca> \r\n" + 
					"		<Origen>pais</Origen>\r\n" + 
					"		<Cantidad>cantidadUnidades</Cantidad>\r\n" + 
					"    </Item>");		
			
			ordenDePedidoXmlPart = ordenDePedidoXmlPart.replace("nroDeSerie", rodamiento.getNumeroDeSerie());
			ordenDePedidoXmlPart = ordenDePedidoXmlPart.replace("sufix", rodamiento.getSufijo());
			ordenDePedidoXmlPart = ordenDePedidoXmlPart.replace("marca", rodamiento.getMarca());
			ordenDePedidoXmlPart = ordenDePedidoXmlPart.replace("pais", rodamiento.getOrigen());
			ordenDePedidoXmlPart = ordenDePedidoXmlPart.replace("cantidadUnidades", String.valueOf(itemRemito.getCantidad()));
			
			remitoAClienteItemParts.put(ordenDePedido, ordenDePedidoXmlPart);
		}
		
		for (final Entry<OrdenDePedido, String> entry : remitoAClienteItemParts.entrySet()) {
			
			final String ordenDePedidoRefXml = entry.getValue().concat("</Rodamientos>\r\n" + 
					"  </OrdenPedido>");
			entry.setValue(ordenDePedidoRefXml);
		}
		
		for (final Entry<OrdenDePedido, String> entry : remitoAClienteItemParts.entrySet()) {
			sb.append(entry.getValue());
		}

		sb.append(" </Referencia> \r\n" + 
				"</Remito> ");
		
		String xml = sb.toString();
		xml = xml.replace("nroDeRemito", remito.getNumero().toString());
		xml = xml.replace("fechaEmision", DateUtils.toXmlDateTimeString(remito.getFechaEmision()));
		xml = xml.replace("cuilCliente", remito.getCliente().getCuil());
		xml = xml.replace("razonSocialCliente", remito.getCliente().getRazonSocial());
		
		return new StringBasedXmlSource(xml);
	}
	
	private String getOrdenDePedidoXmlPart(final OrdenDePedido ordenDePedido, final Map<OrdenDePedido, String> remitoAClienteXmlParts) {
		
		String xml = remitoAClienteXmlParts.get(ordenDePedido);
		
		if (xml == null) {
		
			xml = "<OrdenPedido>\r\n" + 
					"   <Numero>nroOrdenPedido</Numero>\r\n" + 
					"   <Fecha>fechaOrdenPedido</Fecha>\r\n" + 
					"   <Rodamientos>";
			
			xml = xml.replace("nroOrdenPedido", ordenDePedido.getId().toString());
			xml = xml.replace("fechaOrdenPedido",  DateUtils.toXmlDateTimeString(ordenDePedido.getFecha()));
			
			remitoAClienteXmlParts.put(ordenDePedido, xml);
		}
		
		return xml;
	}	
		
	@Override
	protected RemitoACliente doMap(final XmlSource source) throws Exception {
		throw new NotImplementedException();
	}

}
